﻿using System.Collections.Generic;
using System.Linq;

namespace Bettzueche.RLLibrary.Util
{
    /// <summary>
    /// Spezialisierte Kollektion zum Speichern von bspw. Zustand-IDs.<para>
    /// Erbt von HashSet. Kann als Ablaufspeicher verwendet werden, in welchem jedes Element nur einmal vorkommt. Das
    /// Eigenschaftsfeld <c>Trace</c> gibt einen Enumerator vom neusten zum ältesten Element wieder.</para>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class TraceSet<T> : HashSet<T>
    {
        #region private Felder
        #endregion


        #region TraceSet Properties

        /// <summary>
        /// Das Trace Enumerable, dass in umgekehrter Reihenfolge zum Einfügen durchläuft (vom Neusten zum Ältesten).
        /// </summary>
        /// <remarks>Der Standard Enumerator der Basisklasse HashSet gibt Elemente in der Reihenfolge wieder, wie sie eingefügt wurden.
        /// Daher IMMER die Trace-Property nutzen, wenn in umgekehrter Folge (vom Neusten zum Ältesten) durchlaufen werden soll!</remarks>
        public IEnumerable<T> Trace { get { return this.Reverse();} } // Extension schneller als eigene Impl!

        #endregion


        #region Indexer
        #endregion


        #region Konstruktor(en)

        /// <summary>
        /// Initialisiert eine neue Instanz der <see cref="TraceSet{T}"/> Klasse und nutzt den Standard Equality Comparer für den Settyp.
        /// </summary>
        public TraceSet() : base() {
        }

        /// <summary>
        /// Initialisiert eine neue Instanz der <see cref="TraceSet{T}"/> Klasse und nutzt den spezifizierten Equality Comparer für den Settyp.
        /// </summary>
        /// <param name="comparer">The IEqualityComparer{T} implementation to use when comparing values in the set, or null to use the default EqualityComparer{T}
        /// implementation for the set type.</param>
        public TraceSet(IEqualityComparer<T> comparer) : base(comparer) {
        }

        #endregion


        #region TraceSet Methoden
        #endregion


        #region private Hilfsmethoden
        #endregion
    }
}
